Modern microprocessors and other digital devices can carry out an extremely large number of operations in a short amount of time (e.g., millions or billions of microprocessor instructions per second). A significant number of these operations are arithmetic, for example adding, subtracting, multiplying, dividing, incrementing, decrementing, etc. Program execution is of course governed by the results of these operations, though in many cases the information of interest is not the primary result (e.g., the sum output of an add operation) itself, but rather a characteristic of the primary result, the characteristic being variously and alternately referred to herein as side effects, flags, metadata, conditions, etc. For example, instruction branching is often predicated on whether or not a primary result has a value of zero, or whether the primary result involves a carry or overflow. Increasing the speed of arithmetic operations is always of concern, but in many cases it is equally important to quickly determine these so-called “side effects,” such as whether the result is zero, involves a carry or overflow, etc. These characteristics are commonly noted by setting flags. For example, in an arithmetic logic unit (ALU), flags are commonly set to indicate whether the result of an ALU operation was negative (N) or zero (Z) or resulted in a carry (C) or an overflow (V).
Processor performance in many settings is constrained by the speed at which the above-referenced flags are generated. Typical implementations involve a serial process in which the primary result is first calculated; and the primary result is then sent through additional downstream logic to determine the various flags of interest.